Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/self_check.py 461d0fc60b096ca262e447d10b6780d8cd846f30 (461d0fc6) Text, 10.38 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Headless / Settings self-check helpers for critical cross-platform diagnostics."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787contextlib
Tff7b72import T7ee787importlib
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787sys
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787collectionsT7ee787.T7ee787abc Tff7b72import Te6edf3Callable
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backend Tff7b72import Te6edf3self_check_probe Tff7b72as Te6edf3_self_check_probe T8b949e# noqa: F401

Te6edf3_CRITICAL_IMPORTS Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffRNSTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffLXMFTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmfyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffaiohttpTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbcryptTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffcbor2Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbleakTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffwebsocketsTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpsutilTa5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3_SELF_CHECK_PROBE_MODULE Tff7b72= Ta5d6ff"Ta5d6ffmeshchatx.src.backend.self_check_probeTa5d6ff"
Te6edf3_MESHCHATX_RUN_MODULE_FLAG Tff7b72= Ta5d6ff"Ta5d6ff--meshchatx-run-moduleTa5d6ff"

Te6edf3SELF_CHECK_LABELS Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffstack_upTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffNetwork Stack Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffconfig_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffConfiguration IntegrityTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffdb_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffDatabase Connection Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffread_write_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffStorage Read/Write Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffidentity_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIdentity Loaded Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffimports_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffCritical Imports Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffstorage_lock_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffStorage Lock Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftemp_fs_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffTemp Filesystem Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpublic_assets_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffPublic Assets Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fflxmf_router_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLXMF Router Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsubprocess_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffSubprocess Spawn Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffrun_module_goodTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffMeshChatX Run-Module Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbots_lifecycleTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffBot Create/Start/Stop Ta5d6ff"Tb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8ff_statusTb4b4b4(Te6edf3okTb4b4b4: Tffa657boolTb4b4b4, Te6edf3reasonTb4b4b4: Tffa657str Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72if Te6edf3ok Tff7b72else Ta5d6ff"Ta5d6fffailedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffreasonTa5d6ff"Tb4b4b4: Te6edf3reason Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4}


Tff7b72def Td2a8ffcheck_python_runtimeTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3sysTff7b72.Td2a8ffversion_info Tff7b72< Tb4b4b4(T79c0ff3Tb4b4b4, T79c0ff11Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(
Tff7b72FalseTb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ffPython Tffd700{Te6edf3sysTff7b72.Td2a8ffversion_infoTff7b72.Td2a8ffmajorTffd700}Ta5d6ff.Tffd700{Te6edf3sysTff7b72.Td2a8ffversion_infoTff7b72.Td2a8ffminorTffd700}Ta5d6ff is below 3.11Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3sysTff7b72.Td2a8ffexecutable Tff7b72or Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3sysTff7b72.Td2a8ffexecutableTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffsys.executable is missing: Tffd700{Te6edf3sysTff7b72.Td2a8ffexecutableTffd700!r}Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)


Tff7b72def Td2a8ffcheck_critical_importsTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Te6edf3missingTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3errorsTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3name Tff7b72in Te6edf3_CRITICAL_IMPORTSTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3importlibTff7b72.Td2a8ffimport_moduleTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72except Tf85149ModuleNotFoundErrorTb4b4b4:
Te6edf3missingTff7b72.Td2a8ffappendTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3errorsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3nameTffd700}Ta5d6ff: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3missing Tff7b72or Te6edf3errorsTb4b4b4:
Te6edf3parts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3missingTb4b4b4:
Te6edf3partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffmissing Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3missingTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3errorsTb4b4b4:
Te6edf3partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6fferrors Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff | Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3errorsTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ff. Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3partsTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)


Tff7b72def Td2a8ffcheck_identityTb4b4b4(Te6edf3identityTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3identity Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffIdentity is not loadedTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3raw Tff7b72= Tffa657getattrTb4b4b4(Te6edf3identityTb4b4b4, Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3raw Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffIdentity has no hashTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3rawTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4, Tffa657memoryviewTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3hx Tff7b72= Tffa657bytesTb4b4b4(Te6edf3rawTb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3hx Tff7b72= Tffa657strTb4b4b4(Te6edf3rawTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hxTb4b4b4) Tff7b72!= T79c0ff32Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffIdentity hash length is Tffd700{Tffa657lenTb4b4b4(Te6edf3hxTb4b4b4)Tffd700}Ta5d6ff, expected 32Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffIdentity check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffcheck_lxmf_routerTb4b4b4(Te6edf3message_routerTb4b4b4: Te6edf3AnyTb4b4b4, Te6edf3local_destinationTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3message_router Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffLXMF message router is not initializedTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3local_destination Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffLocal LXMF destination is not availableTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dest_hash Tff7b72= Tffa657getattrTb4b4b4(Te6edf3local_destinationTb4b4b4, Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3dest_hash Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffLocal LXMF destination has no hashTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffLXMF destination check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)


Tff7b72def Td2a8ffcheck_storage_lockTb4b4b4(Te6edf3base_dirTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787storage_lock Tff7b72import Te6edf3StorageLockTb4b4b4, Te6edf3StorageLockError

Tff7b72if Tff7b72not Te6edf3base_dir Tff7b72or Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3base_dirTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffStorage directory does not existTa5d6ff"Tb4b4b4)

Te6edf3lock_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3base_dirTb4b4b4, Ta5d6ff"Ta5d6ff.self_test_storage_lockTa5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3lock_dirTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3lock_dirTb4b4b4, Te6edf3ignore_errorsTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3lock_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)

Te6edf3first Tff7b72= Te6edf3StorageLockTb4b4b4(Te6edf3lock_dirTb4b4b4)
Te6edf3firstTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)
Te6edf3second Tff7b72= Te6edf3StorageLockTb4b4b4(Te6edf3lock_dirTb4b4b4)
Te6edf3contested Tff7b72= Tff7b72False
Tff7b72tryTb4b4b4:
Te6edf3secondTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3StorageLockErrorTb4b4b4:
Te6edf3contested Tff7b72= Tff7b72True
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Te6edf3firstTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffUnexpected lock error: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3secondTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Te6edf3firstTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffSecond lock acquire should have failed while heldTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3contestedTb4b4b4:
Te6edf3firstTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffStorage lock did not reject a second holderTa5d6ff"Tb4b4b4)

Te6edf3firstTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)

Te6edf3third Tff7b72= Te6edf3StorageLockTb4b4b4(Te6edf3lock_dirTb4b4b4)
Te6edf3thirdTff7b72.Td2a8ffacquireTb4b4b4(Tb4b4b4)
Te6edf3thirdTff7b72.Td2a8ffreleaseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffStorage lock check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3lock_dirTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3lock_dirTb4b4b4, Te6edf3ignore_errorsTff7b72=Tff7b72TrueTb4b4b4)


Tff7b72def Td2a8ffcheck_temp_filesystemTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Te6edf3path Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3fdTb4b4b4, Te6edf3path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkstempTb4b4b4(Te6edf3prefixTff7b72=Ta5d6ff"Ta5d6ffmeshchatx_self_check_Ta5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffcloseTb4b4b4(Te6edf3fdTb4b4b4)
Te6edf3payload Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ffmeshchatx-temp-checkTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3handleTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Tff7b72if Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3payloadTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffTemp file readback mismatchTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffTemp filesystem check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72if Te6edf3path Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3pathTb4b4b4)


Tff7b72def Td2a8ff_is_frozen_executableTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Tff7b72return Tffa657boolTb4b4b4(Tffa657getattrTb4b4b4(Te6edf3sysTb4b4b4, Ta5d6ff"Ta5d6fffrozenTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ff_frontend_source_availableTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""True when running from a source tree with Vite frontend sources.

Built ``meshchatx/public/`` is gitignored and often absent in CI / E2E
(Vite serves the UI). Frozen desktop builds still require bundled public.
"""
Tff7b72tryTb4b4b4:
Te6edf3package_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Tff7b72__file__Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3frontend Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3package_dirTb4b4b4, Ta5d6ff"Ta5d6ffsrcTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3frontendTb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(
Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3frontendTb4b4b4, Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)
Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return Tff7b72False


Tff7b72def Td2a8ffcheck_public_assetsTb4b4b4(Te6edf3public_path_fnTb4b4b4: Te6edf3CallableTb4b4b4[Tb4b4b4[Tffa657strTb4b4b4]Tb4b4b4, Tffa657strTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3root Tff7b72= Te6edf3public_path_fnTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3index_path Tff7b72= Te6edf3public_path_fnTb4b4b4(Ta5d6ff"Ta5d6ffindex.htmlTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3root Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3root Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3index_pathTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3names Tff7b72= Tb4b4b4[Te6edf3n Tff7b72for Te6edf3n Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Te6edf3rootTb4b4b4) Tff7b72if Tff7b72not Te6edf3nTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4]
Tff7b72if Te6edf3namesTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)

T8b949e# Source / CI / E2E: no built public dir, but frontend sources exist.
Tff7b72if Tff7b72not Te6edf3_is_frozen_executableTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3_frontend_source_availableTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)

Tff7b72if Tff7b72not Te6edf3root Tff7b72or Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3rootTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffPublic assets directory missing: Tffd700{Te6edf3rootTffd700!r}Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffPublic assets directory is emptyTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffPublic assets check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffcheck_meshchatx_run_moduleTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
T8b949e"""Verify ``--meshchatx-run-module`` re-entry used by bots/rnsh on frozen builds."""
Te6edf3marker_dir Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Te6edf3prefixTff7b72=Ta5d6ff"Ta5d6ffmeshchatx_run_module_check_Ta5d6ff"Tb4b4b4)
Te6edf3marker Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3marker_dirTb4b4b4, Ta5d6ff"Ta5d6ffprobe.outTa5d6ff"Tb4b4b4)
Te6edf3env Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffMESHCHATX_SELF_CHECK_PROBE_PATHTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3marker
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffPYTHONUNBUFFEREDTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffMESHCHAT_SKIP_STORAGE_LOCKTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"

Tff7b72if Te6edf3_is_frozen_executableTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3cmd Tff7b72= Tb4b4b4[
Te6edf3sysTff7b72.Td2a8ffexecutableTb4b4b4,
Te6edf3_MESHCHATX_RUN_MODULE_FLAGTb4b4b4,
Te6edf3_SELF_CHECK_PROBE_MODULETb4b4b4,
Ta5d6ff"Ta5d6ffself-checkTa5d6ff"Tb4b4b4,
Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3cmd Tff7b72= Tb4b4b4[
Te6edf3sysTff7b72.Td2a8ffexecutableTb4b4b4,
Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmeshchatx.meshchatTa5d6ff"Tb4b4b4,
Te6edf3_MESHCHATX_RUN_MODULE_FLAGTb4b4b4,
Te6edf3_SELF_CHECK_PROBE_MODULETb4b4b4,
Ta5d6ff"Ta5d6ffself-checkTa5d6ff"Tb4b4b4,
Tb4b4b4]

Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Te6edf3cmdTb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=T79c0ff45Tb4b4b4,
Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3envTff7b72=Te6edf3envTb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3detail Tff7b72= Tb4b4b4(Te6edf3resultTff7b72.Td2a8ffstderr Tff7b72or Te6edf3resultTff7b72.Td2a8ffstdout Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4[Tff7b72-T79c0ff500Tb4b4b4:Tb4b4b4]
Tff7b72return Te6edf3_statusTb4b4b4(
Tff7b72FalseTb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ffrun-module exited Tffd700{Te6edf3resultTff7b72.Td2a8ffreturncodeTffd700}Ta5d6ff: Tffd700{Te6edf3detail Tff7b72or Ta5d6ff'Ta5d6ffno outputTa5d6ff'Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3markerTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffProbe marker file was not writtenTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3markerTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72as Te6edf3handleTb4b4b4:
Te6edf3text Tff7b72= Te6edf3handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffokTa5d6ff" Tff7b72not Tff7b72in Te6edf3text Tff7b72or Ta5d6ff"Ta5d6ffself-checkTa5d6ff" Tff7b72not Tff7b72in Te6edf3textTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffUnexpected probe output: Tffd700{Te6edf3textTffd700!r}Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffrun-module probe timed outTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffrun-module check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72finallyTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3marker_dirTb4b4b4, Te6edf3ignore_errorsTff7b72=Tff7b72TrueTb4b4b4)


Tff7b72def Td2a8ffcheck_subprocess_spawnTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657strTb4b4b4]Tb4b4b4:
T8b949e"""Spawn a short-lived child process (covers Windows CreateProcess / POSIX fork)."""
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(
Tb4b4b4[Te6edf3sysTff7b72.Td2a8ffexecutableTb4b4b4, Ta5d6ff"Ta5d6ff-cTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffprint(Ta5d6ff'Ta5d6ffmeshchatx-spawn-okTa5d6ff'Ta5d6ff, flush=True)Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=T79c0ff30Tb4b4b4,
Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3envTff7b72=Tb4b4b4{Tff7b72*Tff7b72*Te6edf3osTff7b72.Td2a8ffenvironTb4b4b4, Ta5d6ff"Ta5d6ffPYTHONUNBUFFEREDTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(
Tff7b72FalseTb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ffspawn exited Tffd700{Te6edf3resultTff7b72.Td2a8ffreturncodeTffd700}Ta5d6ff: Tffd700{Tb4b4b4(Te6edf3resultTff7b72.Td2a8ffstderr Tff7b72or Ta5d6ff'Ta5d6ff'Tb4b4b4)Tb4b4b4[Tff7b72-T79c0ff300Tb4b4b4:Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffmeshchatx-spawn-okTa5d6ff" Tff7b72not Tff7b72in Tb4b4b4(Te6edf3resultTff7b72.Td2a8ffstdout Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffUnexpected spawn output: Tffd700{Te6edf3resultTff7b72.Td2a8ffstdoutTffd700!r}Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3excTb4b4b4:
Tff7b72return Te6edf3_statusTb4b4b4(Tff7b72FalseTb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffSubprocess spawn check failed: Tffd700{Te6edf3excTffd700}Ta5d6ff"Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────